package com.xncoding.websocket.javax.demo0;

import com.alibaba.fastjson2.JSON;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.nio.ByteBuffer;

/**
 * @ServerEndpoint注解来表示这是一个服务端点，同时可以在注解中配置路径，这个路径可以配置成动态的，使用{}包起来就可以了
 */
@Component
@ServerEndpoint("/websocket/{type}")
public class JavaxWebSocketServerEndpoint {
    /**
     * @OnOpen 用来标记对应的方法作为客户端连接上来之后的回调
     * @param session 就相当于和客户端的连接啦，我们可以把它缓存起来用于发送消息
     * @param config
     * @param type  通过@PathParam注解就可以获得动态路径中对应值了
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig config, @PathParam(value = "type") String type) throws IOException {
        //连接建立
        System.out.println("websocket已经连接" + session.getId());
        session.getBasicRemote().sendText(type+"，你好！欢迎登陆系统");
    }

    /**
     * @OnClose  用来标记对应的方法作为客户端断开连接之后的回调，我们可以在这个方法中移除对应Session的缓存，同时可以接受一个CloseReason的参数用于获取关闭原因
     * @param session
     * @param reason
     */
    @OnClose
    public void onClose(Session session, CloseReason reason) {
        //连接关闭
        System.out.println("websocket已经关闭" + session.getId());
    }

    /**
     * @OnMessage 用来标记对应的方法作为接收到消息之后的回调，我们可以接受文本消息，二进制消息和pong消息
     * @param session
     * @param message
     */
    @OnMessage
    public void onMessage(Session session, String message) {
        //接收文本信息
        System.out.println("接收字符串消息"+session.getId());
        System.out.println(message);
    }

    @OnMessage
    public void onMessage(Session session, PongMessage message) {
        //接收pong信息
        //发送ping
//        session.getAsyncRemote().sendPing(ByteBuffer buffer);
        //发送pong
//        session.getAsyncRemote().sendPong(ByteBuffer buffer);
        System.out.println("接收消息"+session.getId());
        System.out.println(JSON.toJSONString(message));
    }

    @OnMessage
    public void onMessage(Session session, ByteBuffer message) {
        //接收二进制信息，也可以用byte[]接收
        System.out.println("接收消息"+session.getId());
        System.out.println(JSON.toJSONString(message.toString()));
    }

    /**
     * @OnError用来标记对应的方法作为抛出异常之后的回调，可以获得对应的Session和异常对象
     * @param session
     * @param e
     */
    @OnError
    public void onError(Session session, Throwable e) {
        System.out.println(session.getId());
        //异常处理
        e.printStackTrace();
    }
}
